جزوه · فصل هفتم · جلسه ۷۱ · مدیریت لاگ‌ها ← بازگشت به فهرست
📘 فصل هفتم · جلسه ۷۱ مدیریت لاگ‌ها (Logging)
📅 تاریخ: یکشنبه، ۱ شهریور ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
مدیریت لاگ‌ها یکی از مهم‌ترین مباحث در LPIC و RHCSA است. تفاوت Process و Daemon، ساختار syslog، rsyslog، journalctl و logrotate حتماً در آزمون می‌آیند.
📋 قبل از شروع، یه مثال ساده:

فرض کن یه هتل بزرگ داری که توش کلی کارمند و مهمان رفت‌وآمد دارن. برای اینکه بدونی چه اتفاقاتی توی هتل می‌افته، باید یه دفتر ثبت وقایع داشته باشی که توش همه چیز رو یادداشت کنی: کی وارد شده، کی خارج شده، کجا مشکل پیش اومده و ... توی لینوکس، این دفتر رو لاگ (Log) می‌نامند. این جلسه بهت یاد میده چطور لاگ‌ها رو مدیریت کنی، بخوانی و تحلیل کنی.

▍ تفاوت Process و Daemon

قبل از ورود به بحث لاگ‌ها، باید تفاوت بین پردازش (Process) و دامون (Daemon) را بدانید:

ویژگی Process Daemon
تعریف یک برنامه در حال اجرا یک سرویس پس‌زمینه که به طور مداوم اجرا می‌شود
اتصال به ترمینال معمولاً به ترمینال متصل است از ترمینال جدا است (detached)
مدت زمان معمولاً کوتاه‌مدت طولانی‌مدت (معمولاً تا زمان خاموشی سیستم)
نمونه ls, cat, grep sshd, cron, syslogd
🔑 نکته کلیدی:
  • Daemon یک سرویس پس‌زمینه است که سیستم را نظارت می‌کند یا به سایر پردازش‌ها سرویس می‌دهد.
  • دامون‌ها معمولاً با حرف d در انتهای نام خود شناخته می‌شوند (مثل sshd, cron, syslogd).
نکته امتحانی: دامون‌ها در ابتدا با روش SysV Unix پیاده‌سازی می‌شدند، اما امروزه با systemd پیاده‌سازی مدرن‌تری دارند.

▍ اهمیت استفاده از Log

یکی از مهم‌ترین کارهای هر مدیر سیستم، بررسی وضعیت سیستم از طریق لاگ‌ها است. لاگ‌ها به شما کمک می‌کنند:

⚠️ توجه:

برای کار با دامون‌ها (سرویس‌های پس‌زمینه) در لینوکس، به لاگ‌ها نیاز دارید تا بتوانید وضعیت آنها را بررسی کنید.

▍ سه دسته کلی Log در لینوکس

در لینوکس، سه دسته اصلی لاگ وجود دارد که در تصویر به آنها اشاره شده است:

🔹 ۱. ساختار Log هر برنامه (Application Log)

هر برنامه می‌تواند لاگ‌های خود را در فایل‌های جداگانه ذخیره کند. معمولاً این فایل‌ها در /var/log/ قرار دارند.

  • مثال: /var/log/nginx/access.log

🔹 ۲. ساختار syslog

یک سیستم متمرکز برای جمع‌آوری لاگ‌ها از برنامه‌های مختلف. این سیستم استاندارد قدیمی لینوکس است.

  • مثال: rsyslog (نسخه مدرن syslog)

🔹 ۳. ساختار journal

سیستم لاگ‌گیری مدرن systemd که لاگ‌ها را به صورت باینری و ساختاریافته ذخیره می‌کند.

  • مثال: journalctl
سه دسته اصلی لاگ: Application Log، syslog و journal.

▍ ساختار syslog

syslog در سال ۱۹۸۰ توسط Eric Allman (برای پروژه sendmail) ایجاد شد و به سرعت به عنوان یک پروتکل استاندارد لاگ‌گیری در لینوکس پذیرفته شد.

• دو بخش اصلی syslog

• Facilityهای مهم syslog

شماره Facility توضیح
0 kern پیام‌های هسته سیستم
1 user پیام‌های رویدادهای کاربر
2 mail پیام‌های برنامه ایمیل
3 daemon پیام‌های برنامه‌های سیستمی که در پس‌زمینه اجرا می‌شوند
4 auth پیام‌های امنیتی یا احراز هویت
5 syslog پیام‌های خود برنامه لاگ‌گیری
6 lpr پیام‌های چاپگر
7 news پیام‌های برنامه news
8 uucp پیام‌های برنامه Unix-to-Unix copy
9 cron پیام‌های زمان‌بندی cron
10 authpriv پیام‌های امنیتی (محافظت‌شده)
11 ftp پیام‌های برنامه FTP
12 ntp پیام‌های برنامه NTP
13 security پیام‌های حسابرسی (Audit)
14 console پیام‌های هشدار کنسول
15 solaris-cron پیام‌های cron در Solaris
Facilityهای مهم: kern (هسته)، user (کاربر)، mail (ایمیل)، daemon (سرویس‌های پس‌زمینه) و auth (امنیت).

▍ ساختار جدید rsyslog

rsyslog نسخه مدرن و پیشرفته syslog است که در اکثر توزیع‌های امروزی استفاده می‌شود.

• ویژگی‌های rsyslog

• مثال‌هایی از خطوط پیکربندی rsyslog

auth,authpriv.* /var/log/auth.log # لاگ‌های احراز هویت *.*;auth,authpriv.none /var/log/syslog # همه لاگ‌ها به جز احراز هویت kern.* /var/log/kern.log # لاگ‌های هسته mail.* /var/log/mail.log # لاگ‌های ایمیل mail.err /var/log/mail.err # خطاهای ایمیل *.emerg :omusrmsg:* # پیام‌های اضطراری به همه کاربران
فایل پیکربندی rsyslog: /etc/rsyslog.conf

▍ logrotate (چرخش لاگ‌ها)

در سیستم‌های شلوغ، فایل‌های لاگ به سرعت بزرگ می‌شوند و فضای دیسک را پر می‌کنند. برای مدیریت این مشکل، از logrotate استفاده می‌شود که به‌صورت خودکار:

• فایل پیکربندی logrotate

فایل اصلی پیکربندی: /etc/logrotate.conf
فایل‌های جداگانه برای هر برنامه: /etc/logrotate.d/

/var/log/syslog { rotate 7 weekly compress missingok notifempty }

توضیح: این تنظیمات نشان می‌دهد که فایل /var/log/syslog هر هفته چرخانده شود، ۷ نسخه قبلی نگهداری شود، فایل‌های قدیمی فشرده شوند و اگر فایل خالی است، چرخش انجام نشود.

فایل پیکربندی logrotate: /etc/logrotate.conf

▍ systemd-journal (Journaling)

systemd که وظیفه مدیریت سرویس‌ها را دارد، یک قابلیت لاگ‌گیری به نام journal نیز دارد که لاگ‌های سرویس‌های مختلف را ذخیره و نمایش می‌دهد.

• ویژگی‌های journal

▍ دستور journalctl

journalctl ابزار خط فرمان برای مشاهده و مدیریت لاگ‌های systemd journal است.

• گزینه‌های مهم journalctl

گزینه کوتاه گزینه بلند توضیح
-a --all نمایش همه فیلدهای داده (شامل کاراکترهای غیرقابل چاپ)
-e --pager-end رفتن به انتهای لاگ‌ها
-k --dmesg فقط نمایش لاگ‌های هسته (معادل dmesg)
-n number --lines=number نمایش آخرین number لاگ
-r --reverse نمایش لاگ‌ها به ترتیب معکوس (جدیدترین اول)
-S date --since=date نمایش لاگ‌ها از تاریخ مشخص (فرمت: YYYY-MM-DD:HH:MM:SS)
-U date --until=date نمایش لاگ‌ها تا تاریخ مشخص
-u unit --unit=unit فقط نمایش لاگ‌های یک سرویس خاص
-p priority --priority=priority فقط نمایش لاگ‌های با اولویت مشخص (emerg, alert, crit, err, warning, notice, info, debug)
-f --follow دنبال کردن لاگ‌ها (مشابه tail -f)

• مثال‌های عملی journalctl

┌──(ya3in㉿kali)-[~] └─$ journalctl -u ssh.service -- Logs begin at Mon 2025-08-24 10:00:00 +0330, end at Mon 2025-08-24 14:30:00 +0330 -- Aug 24 10:00:05 kali sshd[1234]: Accepted password for ya3in from 192.168.1.100 port 22 Aug 24 10:00:05 kali sshd[1234]: pam_unix(sshd:session): session opened for user ya3in

توضیح: نمایش لاگ‌های سرویس SSH.

┌──(ya3in㉿kali)-[~] └─$ journalctl -n 10 -r

توضیح: نمایش ۱۰ لاگ آخر به ترتیب معکوس (جدیدترین اول).

┌──(ya3in㉿kali)-[~] └─$ journalctl --since "today" --until "now"

توضیح: نمایش لاگ‌های امروز تا الان.

┌──(ya3in㉿kali)-[~] └─$ journalctl -p err

توضیح: فقط نمایش لاگ‌های با اولویت err (خطا) و بالاتر.

💡 نکته:

journalctl بدون آرگومان، همه لاگ‌ها را از ابتدا تا انتها نمایش می‌دهد. برای مشاهده آسان‌تر، از گزینه‌های -n، -r و -u استفاده کنید.

▍ مدیریت فضای journal

لاگ‌های journal می‌توانند فضای زیادی اشغال کنند. برای مدیریت این فضا، از دستورات زیر استفاده کنید:

┌──(ya3in㉿kali)-[~] └─$ journalctl --disk-usage Archived and active journals take up 256.0M in the file system.

توضیح: نمایش حجم اشغال‌شده توسط لاگ‌های journal.

┌──(ya3in㉿kali)-[~] └─$ sudo journalctl --vacuum-size=300M

توضیح: کاهش حجم لاگ‌ها به ۳۰۰ مگابایت (لاگ‌های قدیمی حذف می‌شوند).

┌──(ya3in㉿kali)-[~] └─$ sudo journalctl --vacuum-time=2d

توضیح: حذف لاگ‌های قدیمی‌تر از ۲ روز.

برای مدیریت فضای journal از journalctl --vacuum-size و journalctl --vacuum-time استفاده کنید.

▍ ارسال پیام به journal با systemd-cat

با استفاده از systemd-cat می‌توانید پیام‌های خود را به journal ارسال کنید.

┌──(ya3in㉿kali)-[~] └─$ echo "Test of systemd-cat" | systemd-cat

توضیح: این دستور پیام را به journal ارسال می‌کند.

┌──(ya3in㉿kali)-[~] └─$ journalctl --no-pager | grep systemd-cat May 30 17:43:46 kali cat[2599]: Test of systemd-cat

توضیح: مشاهده پیام ارسال‌شده در journal.

systemd-cat برای ارسال پیام به journal از خط فرمان استفاده می‌شود.
✅ جمع‌بندی نهایی برای امتحان:
  • Process vs Daemon: دامون یک سرویس پس‌زمینه است.
  • سه دسته لاگ: Application Log، syslog، journal
  • syslog: توسط Eric Allman در ۱۹۸۰ ایجاد شد. دو بخش Facility و Severity دارد.
  • rsyslog: نسخه مدرن syslog. فایل پیکربندی: /etc/rsyslog.conf
  • logrotate: چرخش خودکار لاگ‌ها. فایل پیکربندی: /etc/logrotate.conf
  • systemd-journal: لاگ‌گیری مدرن systemd.
  • journalctl: ابزار مشاهده لاگ‌های journal.
  • گزینه‌های مهم journalctl: -u (سرویس)، -n (تعداد)، -r (معکوس)، -S (از تاریخ)، -U (تا تاریخ)، -p (اولویت)
  • مدیریت فضای journal: --vacuum-size و --vacuum-time
  • systemd-cat: ارسال پیام به journal.